//: Playground - noun: a place where people can play

import UIKit
//: # swfit 读书笔记


//: ## 高级运算符

//: ### 位运算符
//: * UInt8 类型的整数有 8 个比特位，可以存储 0 ~ 255 之间的任意整数.


//: ### 按位取反 (~)
//: *                             (1)         (2)     (4)     (8)
//: * 二进制转换成十进制 00001111   1*2^0  +   1*2^1  + 1*2^2 + 1*2^3 = 15
//: *                 11110000   1*2^4  +   1*2^5  + 1*2^6 + 1*2^7 = 240
let initialBits:UInt8 = 0b00001111 // 十进制 15
let revertedBits:UInt8 = ~initialBits //revertedBits 是 11110000   它的十进制  240

//: ### 按位与运算符 (&)
//: * & 运算是合并运算，只有在都是1的情况下才是1 ，其他情况全是 0

let frisSixtNum:UInt8 = 0b00111111
let lastSixNum:UInt8 = 0b11111100
let middleForBits:UInt8 = frisSixtNum & lastSixNum // 等于 00 1111 00
/*
 00 1111 11
 11 1111 00
 ----------
 00 1111 00    1*2^2  +   1*2^3  + 1*2^4 + 1*2^5 = 60
 */

//: ### 按位或运算符 (|)
//: * 可以对两个数的比特位进行比较，只要两个数的对应位中有任意一个为 1 时，新数的对应位就为 1
let someBits:UInt8 = 0b10110010
let moreBits:UInt8 = 0b01011110
let combineBits:UInt8 = someBits | moreBits // 11111110

/*
 1011001 0
 0101111 0
 ---------
 1111111 0    254      255 - 1*2^0 = 254
 */

//: ### 按位异或(^)
//: * 可以对比特位进行比较，只有当两位比特位不相同才返回1， 其他返回0。

let fristNum:UInt8 = 0b00010100
let otherNum:UInt8 = 0b00000101
let outputNum:UInt8 = fristNum ^ otherNum // 等于 00010001
/*
 000 1 010 0
 000 0 010 1
 -----------
 000 1 000 1        1*2^0 + 1*2^4 = 17
 */

//: ### 按位左移(<<)、右移(>>)运算符
//: * 对一个数所有比特位进行移动，对一个数左移,等价于这个数乘以2，相反的一个数右移，等价于这个数除以2。
//: * 对于无符号整数 超出整形的存储范围会被丢弃、空白位用 0 填充。
let shiftBits:UInt8 = 4 //  00000100  1*2^2
shiftBits << 1           // 00001000  1*2^3 = 8  (相当于 4 * 2)
shiftBits << 2           // 00010000
shiftBits << 5           // 10000000
shiftBits << 6           // 00000000
shiftBits >> 2           // 00000001  1*2^0 = 1   右移两位  4/(2*2) = 1

//: * 使用移位运算对其他的数据类型进行编码和解码：
//: * 一位十六进制的数等于四位二进制的数。一个字节等于8位二进制数。 所以16进制是32个字节。
let pink:UInt32 = 0xcc6699


